<template>
  <div class="drop-step-content">
    <h3>填写申请信息</h3>

    <!-- 基本信息区域 -->
    <div class="form-section">
      <h4>基本信息</h4>
      <el-form :model="form" ref="formRef" label-width="120px" class="form-content">
        <el-form-item label="老人姓名" prop="elderName"
          :rules="[{ required: true, message: '请选择老人姓名', trigger: 'change' }]">
          <el-select v-model="form.elderName" placeholder="请选择老人姓名" @change="handleElderChange" filterable>
            <el-option v-for="elderly in elderlyList" :key="elderly.id" :label="elderly.name"
              :value="elderly.name">
              <span style="float: left">{{ elderly.name }}</span>
              <span style="float: right; color: #8492a6; font-size: 13px">{{ elderly.idCard }}</span>
            </el-option>
          </el-select>
        </el-form-item>

        <el-form-item label="老人身份证号" prop="idCard">
          <el-input v-model="form.idCard" placeholder="请输入老人身份证号" readonly />
        </el-form-item>

        <el-form-item label="联系方式" prop="phone">
          <el-input v-model="form.phone" placeholder="请输入联系方式" readonly />
        </el-form-item>

        <el-form-item label="费用期限" prop="feePeriod">
          <el-input v-model="form.feePeriod" placeholder="请输入费用期限" readonly />
        </el-form-item>

        <el-form-item label="护理等级" prop="nursingLevel">
          <el-input v-model="form.nursingLevel" placeholder="请输入护理等级" readonly />
        </el-form-item>

        <el-form-item label="入住床位" prop="bed">
          <el-input v-model="form.bed" placeholder="请输入入住床位" readonly />
        </el-form-item>

        <el-form-item label="签约合同" prop="contract">
          <el-input v-model="form.contract" placeholder="请输入签约合同号" readonly />
        </el-form-item>

        <el-form-item label="养老顾问" prop="advisor">
          <el-input v-model="form.advisor" placeholder="请输入养老顾问" readonly/>
        </el-form-item>

        <el-form-item label="护理员" prop="nurse">
          <el-input v-model="form.nurse" placeholder="请输入护理员" readonly />
        </el-form-item>
      </el-form>
    </div>

    <!-- 申请信息区域 -->
    <div class="form-section">
      <h4>申请信息</h4>
      <el-form :model="form" ref="formRef" label-width="120px" class="form-content">
        <el-form-item label="退住日期" prop="checkoutDate" :rules="checkoutDateRules">
          <el-date-picker v-model="form.checkoutDate" type="date" placeholder="选择退住日期" value-format="YYYY-MM-DD" />
        </el-form-item>

        <el-form-item label="退住原因" prop="reason" :rules="[{ required: true, message: '请选择退住原因', trigger: 'change' }]">
          <el-select v-model="form.reason" placeholder="请选择退住原因">
            <el-option label="个人原因" value="personal" />
            <el-option label="身体康复" value="recovery" />
            <el-option label="服务不满意" value="dissatisfaction" />
            <el-option label="其他原因" value="other" />
          </el-select>
        </el-form-item>

        <el-form-item label="备注说明" prop="remark">
          <el-input v-model="form.remark" type="textarea" placeholder="请输入备注信息" :rows="3" maxlength="200"
            show-word-limit />
        </el-form-item>
      </el-form>
    </div>

    <!-- 操作按钮 -->
    <div class="step-buttons">
      <el-button @click="handleBack" size="default">返回</el-button>
      <el-button type="primary" @click="handleSubmit" size="default">提交</el-button>
    </div>
  </div>
</template>


<script setup>
import { ref, onMounted, computed } from 'vue';
import { ElMessage } from 'element-plus';
import { listApprovedElderlyInfo } from '@/api/system/checkappeoval';
import { getContent, addContent } from '@/api/drop/content'; // 新增：引入getContent用于回显数据
import useUserStore from '@/store/modules/user';
import { addAccraditationrecord } from '@/api/accraditationrecord/accraditationrecord';
import { getCountCheckappeoval } from '@/api/system/checkappeoval';  // 新增：用于根据老人id查看所选老人是否有处于申请中的数据

// 接收父组件传递的参数（步骤数和数据ID）
const props = defineProps({
  stepNum: {
    type: Number,
    default: 1 // 步骤一默认stepNum为1
  },
  dropContentId: {
    type: [String, Number],
    default: '' // 从父组件接收的数据ID，用于回显
  }
});

// 向父组件传递事件
const emit = defineEmits(['submit-step', 'back-to-list']);

// 2. 获取用户存储实例
const userStore = useUserStore();

// 表单数据
const form = ref({
  approvalId: '',     // 所选老人对应的入住ID
  elderlyId: '',      // 老人ID（必填）
  elderName: '',      // 老人姓名（必填）
  idCard: '',         // 老人身份证号
  phone: '',          // 联系方式
  feePeriod: '',      // 费用期限
  nursingLevel: '',   // 护理等级
  bed: '',            // 入住床位
  contract: '',       // 签约合同
  advisor: '',        // 养老顾问
  nurse: '',          // 护理员
  checkoutDate: '',   // 退住日期（必填，格式：YYYY-MM-DD）
  reason: '',         // 退住原因（必填）
  remark: '',         // 备注说明
  applyName: '',      // 发起申请的护理员姓名（必填）
  applyTime: ''       // 发起申请的时间（必填，格式：YYYY-MM-DD HH:mm:ss）
});

// 存储当前选中老人的费用结束日期（格式：YYYY-MM-DD）
const selectedElderlyEndDate = ref('');
// 老人列表数据
const elderlyList = ref([]);
const formRef = ref(null);

// 日期格式处理工具函数
const formatDateToStr = (date) => {
  if (!date) return '';
  const d = new Date(date);
  // 处理无效日期
  if (isNaN(d.getTime())) return '';
  return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
};

// 格式化时间（带时分秒）
const formatDateTimeToStr = (date) => {
  if (!date) return '';
  const d = new Date(date);
  if (isNaN(d.getTime())) return '';
  return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')} ${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')}`;
};

const checkoutDateRules = computed(() => [
  { required: true, message: '请选择退住日期', trigger: ['change', 'blur'] },
  {
    validator: (rule, value, callback) => {
      // 1. 必须先选择老人
      if (!form.value.elderName) {
        return callback(new Error('请先选择老人信息'));
      }

      // 2. 必须选择退住日期
      if (!value) {
        return callback(new Error('请选择退住日期'));
      }

      // 3. 必须有有效的费用结束日期
      if (!selectedElderlyEndDate.value) {
        return callback(new Error('未获取到该老人的费用结束日期，请重新选择老人'));
      }

      // 4. 将日期字符串转换为Date对象进行准确比较
      const checkoutDate = new Date(value);
      const today = new Date();
      today.setHours(0, 0, 0, 0);

      const feeEndDate = new Date(selectedElderlyEndDate.value);
      feeEndDate.setHours(0, 0, 0, 0);

      // 5. 检查是否早于今天
      if (checkoutDate < today) {
        return callback(new Error(`退住日期不能早于今天（${formatDateToStr(today)}）`));
      }

      // 6. 检查是否晚于费用结束日期
      if (checkoutDate > feeEndDate) {
        return callback(new Error(`退住日期不能晚于费用结束日期（${formatDateToStr(feeEndDate)}）`));
      }

      // 所有验证通过
      callback();
    },
    trigger: ['change', 'blur', 'submit']
  }
]);

// 加载老人列表 
const loadElderlyList = async () => {
  try {
    const response = await listApprovedElderlyInfo();
    
    if (response.code === 200 && response.rows) {
      // 先过滤掉合同为null/空值的数据，再进行映射处理
      elderlyList.value = response.rows
        .filter(item => {
          const contract = item.contractNo;
          const isEmpty = !(typeof contract !== 'undefined' && contract !== null && String(contract).trim() !== '');
          return !isEmpty;
        })
        .map(item => {
          const feeEndDate = item.feeEndDate || item.fee_end_date || '';
          const feeStartDate = item.feeStartDate || item.fee_start_date || '';
          const feeStartDateStr = formatDateToStr(feeStartDate);
          const feeEndDateStr = formatDateToStr(feeEndDate);

          return {
            id: item.approvalId || '',
            eid: item.elderlyId || '',
            name: item.elderlyName || '',
            contract: item.contractNo || '',
            idCard: item.elderlyIdCard || '',
            phone: item.contact_number || '',
            feeStartDate: feeStartDateStr,
            feeEndDate: feeEndDateStr, // 存储格式化后的结束日期
            feePeriod: `${feeStartDateStr} 至 ${feeEndDateStr}`,
            nursingLevel: item.nursingLevel || '',
            bedId: item.bedId,
            bed: item.bedNo || ''
          };
        });
    } else {
      ElMessage.error('获取老人列表失败，请刷新重试');
    }
  } catch (error) {
    console.error('获取老人列表出错:', error);
    ElMessage.error('获取老人列表失败，网络异常');
  }
};

// 老人选择变化处理 - 确保正确设置费用结束日期
const handleElderChange = (name) => {
  const selectedElderly = elderlyList.value.find(item => item.name === name);
  if (selectedElderly) {
    // 基础信息赋值
    form.value.approvalId = selectedElderly.id; // 存储所选老人的入住ID
    form.value.elderlyId = selectedElderly.eid;
    form.value.elderName = selectedElderly.name;
    form.value.idCard = selectedElderly.idCard;
    form.value.phone = selectedElderly.phone;
    form.value.nursingLevel = selectedElderly.nursingLevel;
    form.value.bed = selectedElderly.bed;
    form.value.feePeriod = selectedElderly.feePeriod;
    form.value.contract = selectedElderly.contract;
    form.value.advisor = userStore.nickName || '';
    form.value.nurse = userStore.nickName || '';
    form.value.applyName = userStore.nickName || '';
    form.value.applyTime = formatDateTimeToStr(new Date()); // 存储当前时间（带时分秒）
    // 设置费用结束日期
    selectedElderlyEndDate.value = selectedElderly.feeEndDate;
    // 清除旧的退住日期
    form.value.checkoutDate = '';
  } else {
    selectedElderlyEndDate.value = '';
    form.value.checkoutDate = '';
    form.value.idCard = '';
    form.value.phone = '';
    form.value.feePeriod = '';
  }

  // 触发验证
  if (formRef.value) {
    formRef.value.validateField('checkoutDate');
  }
};

// 表单验证方法（暴露给父组件调用）
const validateForm = async () => {
  if (!formRef.value) return false;
  try {
    await formRef.value.validate();
    return true;
  } catch (error) {
    ElMessage.warning('表单填写有误，请查看红色提示并修正');
    return false;
  }
};

// 暴露验证方法给父组件
defineExpose({
  validateForm
});

// 从接口加载数据并回显（当有dropContentId时）
const loadFormData = async () => {
  if (!props.dropContentId) return; // 没有ID则不加载

  try {
    const res = await getContent(props.dropContentId);
    if (res.data?.currentInfo) {
      const data = JSON.parse(res.data.currentInfo);
      form.value = { ...data }; // 回显表单数据

      // 特殊处理：根据回显的老人姓名，匹配老人列表中的费用结束日期
      const selectedElderly = elderlyList.value.find(item => item.name === data.elderName);
      if (selectedElderly) {
        selectedElderlyEndDate.value = selectedElderly.feeEndDate;
      }
    }
  } catch (error) {
    console.error('步骤一加载历史数据失败：', error);
    ElMessage.warning('加载历史数据失败，可能影响表单验证');
  }
};

// 点击返回按钮
const handleBack = () => {
  emit('back-to-list');
};

// 生成bussniessId的方法
function generateBusinessId() {
  const date = new Date();
  // 获取年月日时分秒，确保每个部分都是2位或4位（年为4位）
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始，需+1
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');

  // 拼接成COUT+年月日时分秒格式
  return `COUT${year}${month}${day}${hours}${minutes}${seconds}`;
}


// 提交表单
const handleSubmit = async () => {
  // 第一步：先做表单验证
  if (!(await validateForm())) {
    return;
  }

  try {
    // 第二步：检查该老人是否有处于申请中的数据
    const checkResponse = await getCountCheckappeoval(form.value.elderlyId);
    
    if (checkResponse.code === 200) {
      const dataCount = checkResponse.data || 0;
      
      // 如果有申请中的数据，阻止提交并提示
      if (dataCount > 0) {
        ElMessage.warning('该老人已有退住申请正在处理中，请勿重复提交');
        return;
      }
    }

    // 补充当前申请时间（确保提交时是最新时间）
    form.value.applyTime = formatDateTimeToStr(new Date());

    // 构造请求参数，将form转成JSON字符串存入currentInfo
    const requestData = {
      currentInfo: JSON.stringify(form.value)
    };

    // 调用新增接口
    const response = await addContent(requestData);

    if (response.code === 200 && response.dropContentId) {
      // 向父组件传递：新的dropContentId和当前步骤数
      emit('submit-step', {
        dropContentId: response.dropContentId,
        currentStep: props.stepNum // 明确传递当前步骤数
      });
      ElMessage.success('申请信息提交成功');
      
      //加入审批表
      const approvalForm = ref({
        dropContentId: response.dropContentId,
        auditStatus: "申请中",
        type: "退住",
        approverId: userStore.id,
        approverName: userStore.nickName,
        approverNameRole: userStore.roles[0],
        currentStep: "申请退住",
        nextStep: "申请审批",
        stepNo: "2",
        handleType: "申请中",
        bussniessId: generateBusinessId(),
        createBy: form.value.elderlyId, // 添加老人ID
      });
      addAccraditationrecord(approvalForm.value);
    } else {
      ElMessage.error(`提交失败：${response.msg || '未知错误'}`);
    }
  } catch (error) {
    console.error('退住申请提交出错：', error);
    ElMessage.error('提交失败，请检查网络后重试');
  }
};

// 组件挂载时加载数据
onMounted(async () => {
  await loadElderlyList(); // 先加载老人列表
  if (props.dropContentId) {
    // 如果有ID，加载历史数据回显（需在老人列表加载后执行）
    await loadFormData();
  } else {
    // 初始化当前用户信息（新申请时）
    form.value.nurse = userStore.nickName || '';
    form.value.applyName = userStore.nickName || '';
  }
});
</script>